import { isArray, isString, trim } from 'lodash';

/**
 * 数据规则规则
 */
const rules = {
    // 数值类型，可以是整数，也可以是浮点数
    number(value) {
        return !isNaN(value)
    },
    
    // 值在一个数组范围内
    in(value, inRange) {
        if (isArray(inRange)) {
            return inRange.includes(value)
        }

        if (isString(inRange)) {
            return this.equal(value, inRange)
        }
    
        return false
    },

    // 值不在一个范围内
    notIn(value, inArr) {
        return !this.in(value, inArr)
    },
    
    // 判断是否是整数
    integer(value) {
        let numValue = value

        if (isString(value)) {
            numValue = parseInt(value, 10)
            
            if (value !== (numValue.toString())) {
                return false
            }
        }
        
        return Number.isInteger(numValue) 
    },
    
    // 判断是否是浮点数， 并且可以指定保留位数
    float(value, reserved = null) {
        let reg = /^(-?\d+)(\.\d+)?$/
        
        if (this.integer(reserved)) {
            reg = new RegExp('^\\+?(\\d*\\.\\d{' + reserved + '})$') 
        }
    
        return reg.test(value)
    },
    
    // 自定义正则验证
    regex(value, pattern) {
        if (isString(value)) {
            return pattern.test(value)
        }
    },
    
    // 必须存在
    required(value) {
        value = trim(value)
        return '' !== value && null !== value
    },
    
    // 同意协议
    accepted(str) {
        if (1 === str || '1' === str || true === str || 'yes' === str || 'on' === str) {
            return true
        }
    
        return false
    },
    
    // 大小写字母
    alpha(str) {
        const reg = /^[A-Za-z]+$/
        return reg.test(str)
    },
    
    // 大小写字母，数字
    alphaNum(str) {
        const reg = /^[A-Za-z0-9]+$/
        return reg.test(str)
    },
    
    // 大小写字母，数字，下划线，中划线
    alphaDash(str) {
        const reg = /^[A-Za-z0-9_-]+$/
        return reg.test(str)
    },
    
    // 数组验证
    array(arr) {
        return isArray(arr)
    },
    
    // 可转换的boolean值
    bool(data) {
        return true === data || data === false || data === 1 || data === 0 || data === '1' || data === '0'
    },
    
    // 两个字段的值相等, 用于类似密码和密码确认的场景
    confirmed(value1, value2) {
        return this.equal(value1, value2)
    },
    
    // 字符串最大长度
    maxLength(value, max) {
        if (isString(value)) {
            return value.length <= max
        }
        
        return false
    },
    
    // 字符串最小长度
    minLength(value, min) {
        if (isString(value)) {
            return value.length >= min
        }
        
        return false
    },

    // 字符串长度在一个范围之内
    betweenLength(value, arr) {
        if (isString(value) && isArray(arr)) {
            return (value.length >= arr[0]) && (value.length <= arr[1])
        }
        
        return false
    },
    
    // 值为null
    nullable(value) {
        return null === value
    },
    
    // 合法uri
    uri(textval) {
        const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
        return urlregex.test(textval)
    },
      
    // 验证email邮箱
    email(email) {
        const re = /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
        return re.test(email)
    },

    // 两个值，完全相等
    equal(value1, value2) {
        return value1 === value2 
    }
}

export default rules